package design;

import com.alibaba.fastjson.JSON;

import java.lang.reflect.InvocationTargetException;
import java.util.Map;

/**
 * @author: hero生仔
 * MQ消息体适配类
 */
public class MQAdapter {
    public static RebateInfo filter(String strJson, Map<String, String> link) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException{
        return filter(JSON.parseObject(strJson, Map.class), link);
    }

    /**
     * 主要用于把不同类型MQ的各种属性，映射成我们需要的属性并且返回。就像一个属性中有用户 ：id，uid；映射到我们需要的：userId，做统一的处理。
     * 而这个处理中需要把映射管理传递给Map<String, String> link，也就是准确地描述了当前MQ中某个属性名称，映射为我们的某个属性名称。
     * 最终因为我们接收到的mq消息基本都是JSON格式，可以转换为Map结构，最后使用反射调用 的方式给我们的类型进行赋值。
     * @param obj
     * @param link
     */
    public static RebateInfo filter(Map obj, Map<String, String> link) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException{
        RebateInfo rebateInfo = new RebateInfo();
        for (String key : link.keySet()) {
            // 获取是什么类型的对象
            Object val = obj.get(link.get(key));
            RebateInfo.class.getMethod("set" + key.substring(0, 1).toUpperCase() + key.substring(1), String.class).invoke(rebateInfo, val.toString());
        }
        return rebateInfo;
    }
}
